From 8be95ca34815e33b08688e198561e5bc32161a20 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 9 May 2019 03:11:48 +0200 Subject: [PATCH] css: Add data URL parsing to images --- gtk/gtkcssimageurl.c | 27 +++++++++++++++++++++++++++ testsuite/reftests/data-url.css | 3 +++ testsuite/reftests/data-url.ref.ui | 12 ++++++++++++ testsuite/reftests/data-url.ui | 8 ++++++++ testsuite/reftests/meson.build | 3 +++ 5 files changed, 53 insertions(+) create mode 100644 testsuite/reftests/data-url.css create mode 100644 testsuite/reftests/data-url.ref.ui create mode 100644 testsuite/reftests/data-url.ui diff --git a/gtk/gtkcssimageurl.c b/gtk/gtkcssimageurl.c index e46dd0ac9b..361844394d 100644 --- a/gtk/gtkcssimageurl.c +++ b/gtk/gtkcssimageurl.c @@ -27,6 +27,8 @@ #include "gtkcssimagepaintableprivate.h" #include "gtkstyleproviderprivate.h" +#include "gtk/css/gtkcssdataurlprivate.h" + G_DEFINE_TYPE (GtkCssImageUrl, _gtk_css_image_url, GTK_TYPE_CSS_IMAGE) static GtkCssImage * @@ -52,6 +54,31 @@ gtk_css_image_url_load_image (GtkCssImageUrl *url, g_free (resource_path); g_free (uri); } + else if (g_file_has_uri_scheme (url->file, "data")) + { + GInputStream *stream; + char *uri; + GdkPixbuf *pixbuf; + GBytes *bytes; + + uri = g_file_get_uri (url->file); + texture = NULL; + + bytes = gtk_css_data_url_parse (uri, NULL, &local_error); + if (bytes) + { + stream = g_memory_input_stream_new_from_bytes (bytes); + pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, &local_error); + g_object_unref (stream); + if (pixbuf != NULL) + { + texture = gdk_texture_new_for_pixbuf (pixbuf); + g_object_unref (pixbuf); + } + } + + g_free (uri); + } else { texture = gdk_texture_new_from_file (url->file, &local_error); diff --git a/testsuite/reftests/data-url.css b/testsuite/reftests/data-url.css new file mode 100644 index 0000000000..94d9625690 --- /dev/null +++ b/testsuite/reftests/data-url.css @@ -0,0 +1,3 @@ +.background { + background: red url('data:,'); +} diff --git a/testsuite/reftests/data-url.ref.ui b/testsuite/reftests/data-url.ref.ui new file mode 100644 index 0000000000..7a09474075 --- /dev/null +++ b/testsuite/reftests/data-url.ref.ui @@ -0,0 +1,12 @@ + + + + popup + + + 0 + green-20x20.png + + + + diff --git a/testsuite/reftests/data-url.ui b/testsuite/reftests/data-url.ui new file mode 100644 index 0000000000..6fa417228a --- /dev/null +++ b/testsuite/reftests/data-url.ui @@ -0,0 +1,8 @@ + + + + 20 + 20 + popup + + diff --git a/testsuite/reftests/meson.build b/testsuite/reftests/meson.build index 3bbfe1abdd..6039ae709f 100644 --- a/testsuite/reftests/meson.build +++ b/testsuite/reftests/meson.build @@ -194,6 +194,9 @@ testdata = [ 'css-multi-state.css', 'css-multi-state.ref.ui', 'css-multi-state.ui', + 'data-url.css', + 'data-url.ref.ui', + 'data-url.ui', 'fixed-widget-stacking.ref.ui', 'fixed-widget-stacking.ui', 'flipping-icons.ref.ui', -- 2.30.2